package com.dlc.garbagerecyclebox;

/**
 * @author :      fangbingran
 * @aescription : 所有的命令码
 * @date :        2019/07/26  14:10
 */
public interface GarbageRecyclerBoxProtocol {
    /**
     * 命令码长度
     */
    int COMMAND_LEN = 2;
    /**
     * 命令码流水号开始标识,第6位
     */
    int COMMAND_NUMBER_LEN = 4;
    /**
     * 设备地址长度
     */
    int DEVICE_ADDRESS_IEN = 1;
    /**
     * 箱子的协议最短字节不包含数据域（帧头(2字节)+协议版本号(1字节)+ 设备地址(1字节)+命令码(2个字节)+ 命令流水号(4个字节)+ 内容长度(1个字节)+内容(N个字节)+校验异或（1个字节））
     * 帧头	    协议版本号	设备地址	命令码	 命令流水号	内容长度	内容	 校验
     * 2个字节	1个字节	    1个字节  	2个字节	 4个字节	1个字节	    N个字节	 1个字节
     */
    int MIN_PACK_LEN = 2 + DEVICE_ADDRESS_IEN + 1 + COMMAND_LEN + COMMAND_NUMBER_LEN + 1 + 1;
    /**
     * 帧头
     */
    byte FRAME_HEADER = (byte) 0x3B;
    byte FRAME_HEADER2 = (byte) 0xB3;
    /**
     * 协议版本号
     */
    byte PROTOCOL_VERSION_NUMBER = (byte) 0x01;

    /**
     * 命令流水号(4个字节),1个字节8Bit,int占32位的时候，最大可以赋值为：2147483647
     */
    int MAX_CMD_PIPELINE_NUMBER = (int) Math.pow(2, 32) - 1;

    byte CMD_ZERO = (byte) 0x00;
    /**
     * 异或字节长度
     */
    int OXR_LEN = 1;
    /**
     * 数据长度标识,第11位
     */
    int DATA_LEN_INDEX = 10;
    /**
     * 数据默认位置,第12位
     */
    int DATA_INDEX = 11;
    /**
     * 命令码开始标识,第5位
     */
    int COMMAND_INDEX = 4;
    /**
     * 设备地址开始标识,第4位
     */
    int DEVICE_ADDRESS_INDEX = 3;

    /**
     * 命令码流水号开始标识,第7位
     */
    int COMMAND_NUMBER_INDEX = 6;

    /**
     * 心跳命令
     */
    byte CMD_HEART_BEAT = (byte) 0x41;

    /**
     * 投递命令
     */
    byte CMD_DELIVERY = (byte) 0x54;
    /**
     * 回收命令
     */
    byte CMD_RECYCLING = (byte) 0x52;
    /**
     * 管理维护命令
     */
    byte CMD_MANAGE_MAINTAIN = (byte) 0x4D;


    /**
     * 查询命令
     */
    byte CMD_QUERY = (byte) 0x43;
    /**
     * 有害垃圾投递命令
     */
    byte CMD_OPEN_HARMFUL_WASTE = (byte) 0x39;

    /**
     * 投递流程相关命令
     */
    interface DeliveryCmd {
        /********************投递前******************/
        /**
         * 副柜：开门前称重
         */
        byte CMD_WEIGHING_BEFORE_OPEN_DOOR = (byte) 0x30;
        /**
         * 开上舱门
         */
        byte CMD_OPEN_HATCH_DOOR = (byte) 0x31;
        /********************投递中******************/
        /**
         * 主柜：等待第一光电触发（投递超时/结束投递命令）
         */
        byte CMD_FIRST_PHOTOELECTRIC_TRIGGER = (byte) 0x32;
        /**
         * 主柜：传送至第二光电
         */
        byte CMD_TWO_PHOTOELECTRIC_TRIGGER = (byte) 0x33;
        /**
         * 主柜：拍照识别
         */
        byte CMD_PHOTO_RECOGNITION = (byte) 0x34;
        /**
         * 0x35：主柜：识别通过传送至第三光电
         */
        byte CMD_THREE_PHOTOELECTRIC_TRIGGER = (byte) 0x35;
        /**
         * 主柜：识别失败返回至第一光电
         */
        byte CMD_RETURN_FIRST_PHOTOELECTRIC_TRIGGER = (byte) 0x36;
        /**
         * 0x37：主柜：等待取走异常饮料瓶（30秒超时）
         */
        byte CMD_WAITING_REMOVAL_EXCEPTION = (byte) 0x37;
        /**
         * 0x38：主柜：等待取走异常饮料瓶超时直接入桶（不计数）
         */
        byte CMD_WAITING_REMOVAL_EXCEPTION2 = (byte) 0x38;
        /********************投递结束******************/
        /**
         * 关上舱门
         */
        byte CMD_CLOSE_HATCH_DOOR = (byte) 0x39;
        /**
         * 0x61：关门夹手触发第一次回走
         */
        byte CMD_FIRST_CLOSE_DOOR_CLAMP_HAND = (byte) 0x61;
        /**
         * 关门夹手触发第一次重新关门
         */
        byte CMD_CLAMP_HAND_AGAIN_CLOSE_DOOR = (byte) 0x62;
        /**
         * 关门夹手触发第二次回走并结束
         */
        byte CMD_TWO_CLOSE_DOOR_CLAMP_HAND = (byte) 0x63;
        /**
         * 0x64：副柜：关门后称重
         */
        byte CMD_WEIGHING_AFTER_CLOSE_DOOR = (byte) 0x64;
        /**
         * 投递完成
         */
        byte CMD_DELIVERY_COMPLETED = (byte) 0x77;
    }
}
